﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace Whistler
{
    public class Sound
    {
        [DllImport("winmm.dll", SetLastError = true, CallingConvention = CallingConvention.Winapi)]
        static extern bool PlaySound(string pszSound, IntPtr hMod, SoundFlags sf);

        [Flags]
        public enum SoundFlags : int
        {
            SND_SYNC = 0x0000,  // play synchronously (default) 

            SND_ASYNC = 0x0001,  // play asynchronously 

            SND_NODEFAULT = 0x0002,  // silence (!default) if sound not found 

            SND_MEMORY = 0x0004,  // pszSound points to a memory file

            SND_LOOP = 0x0008,  // loop the sound until next sndPlaySound 

            SND_NOSTOP = 0x0010,  // don't stop any currently playing sound 

            SND_NOWAIT = 0x00002000, // don't wait if the driver is busy 

            SND_ALIAS = 0x00010000, // name is a registry alias 

            SND_ALIAS_ID = 0x00110000, // alias is a predefined ID

            SND_FILENAME = 0x00020000, // name is file name 

            SND_RESOURCE = 0x00040004  // name is resource name or atom 

        }

        /// <summary>
        /// Plays a sound. Optionally blocks while the sound is playing.
        /// </summary>
        /// <param name="soundFileName">the name of the sound to play</param>
        /// <param name="playAsync">true if the method should return right away, false if it should block until the sound is done playing</param>
        public static void PlaySound(string soundFileName, bool playAsync)
        {
            try
            {
                // play the sound from the selected filename
                SoundFlags flags = SoundFlags.SND_FILENAME | (playAsync ? SoundFlags.SND_ASYNC : SoundFlags.SND_SYNC);
                PlaySound(soundFileName, IntPtr.Zero, flags);
            }
            catch
            {
                int errorNumber = Marshal.GetLastWin32Error();
                if (errorNumber != 0)
                {
                    //Something went wrong;
                }
            }
        }
    }
}
